

/**
 * 表格排序状态
 */
export interface TableSortState {
  prop: string;
  order: 'asc' | 'desc' | null;
}

/**
 * 表格列属性
 */
export interface TableColumnProps {
  /** 列数据的属性名 */
  prop?: string;
  /** 列标题 */
  label?: string;
  /** 列宽度 */
  width?: string | number;
  /** 列最小宽度 */
  minWidth?: string | number;
  /** 列最大宽度 */
  maxWidth?: string | number;
  /** 列弹性宽度系数 */
  flex?: number;
  /** 固定列位置 'left' | 'right' | boolean */
  fixed?: 'left' | 'right' | boolean;
  /** 是否可排序 */
  sortable?: boolean;
  /** 列类型 'selection' | 'expand' | 'index' */
  type?: 'selection' | 'expand' | 'index';
  /** 是否显示溢出提示 */
  showOverflowTooltip?: boolean;
  /** 自定义列样式 */
  className?: string;
  /** 自定义表头样式 */
  labelClassName?: string;
  /** 是否隐藏列 */
  isHidden?: boolean;
  /** 单元格行合并数 */
  rowspan?: number;
  /** 单元格列合并数 */
  colspan?: number;
  /** 自定义插槽名称 */
  slotName?: string;
  /** 自定义格式化函数 */
  formatter?: (row: Record<string, any>, column: TableColumnProps) => string;
  /** 排序方法 */
  sortMethod?: (a: any, b: any) => number;
  /** 子列配置 */
  children?: TableColumnProps[];
}

/**
 * 表格属性
 */
export interface TableProps {
  /** 表格数据 */
  data?: Record<string, any>[];
  /** 是否显示斑马纹 */
  stripe?: boolean;
  /** 是否显示边框 */
  border?: boolean;
  /** 表格高度 */
  height?: string | number;
  /** 表格最大高度 */
  maxHeight?: string | number;
  /** 行类名回调方法 */
  rowClassName?: string | ((row: Record<string, any>, index: number) => string);
  /** 行内键名 */
  rowKey?: string | ((row: Record<string, any>) => string);
  /** 是否显示表头 */
  showHeader?: boolean;
  /** 是否显示表格底部 */
  showFooter?: boolean;
  /** 高亮当前行 */
  highlightCurrentRow?: boolean;
  /** 当前行的row-key，高亮当前行时使用 */
  currentRowKey?: string | number;
  /** 表格尺寸 'default' | 'medium' | 'small' | 'mini' */
  size?: 'default' | 'medium' | 'small' | 'mini';
  /** 空表格内容 */
  emptyText?: string;
  /** 表格布局 'fixed' | 'auto' */
  tableLayout?: 'fixed' | 'auto';
}

/**
 * 表格上下文类型
 */
export interface TableContext {
  columns: TableColumnProps[];
  data: Record<string, any>[];
  sortState: TableSortState | null;
  toggleRowSelection: (row: Record<string, any>, selected?: boolean) => void;
  clearSelection: () => void;
  getSelectionRows: () => Record<string, any>[];
  registerColumn: (column: TableColumnProps) => void;
  unregisterColumn: (column: TableColumnProps) => void;
}